//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "TAfin.h"
//---------------------------------------------------------------------------
TAfin::TAfin(){
        matriz_identidad();
}

TAfin::TAfin(double matriz[16]){
        for(int i=0; i<16; i++)
                _m[i]=matriz[i];
}

void TAfin::postmultiplica(double matriz[16]){
        double resultado[16],acumulado,valor1,valor2;
        int indice1,indice2,indice3;

        for(int i=0;i<4;i++)
                for(int j=0;j<4;j++){
                        acumulado=0;
                        for(int k=0;k<4;k++){
                                indice1=4*k+j;
                                indice2=4*i+k;
                                valor1=_m[indice1];
                                valor2=matriz[indice2];
                                acumulado+=valor1*valor2;
                        }
                        indice3=4*i+j;
                        resultado[indice3]=acumulado;
                }
        for(int i=0;i<16;i++)
              _m[i]=resultado[i];
}

void TAfin::matriz_identidad(){
        /*
                1 0 0 0
                0 1 0 0
                0 0 1 0
                0 0 0 1
        */
        _m[0]=1;         _m[4]=0;         _m[8]=0;         _m[12]=0;
        _m[1]=0;         _m[5]=1;         _m[9]=0;         _m[13]=0;
        _m[2]=0;         _m[6]=0;         _m[10]=1;        _m[14]=0;
        _m[3]=0;         _m[7]=0;         _m[11]=0;        _m[15]=1;
}

void TAfin::traslada(PV3D* punto){
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
                glLoadIdentity();
                glTranslated(punto->getX(),punto->getY(),punto->getZ());
                double leMatriz[16];
                glGetDoublev(GL_MODELVIEW_MATRIX,leMatriz);
        glPopMatrix();

        postmultiplica(leMatriz);
}

void TAfin::rota(double angulo, PV3D* eje){
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
                glLoadIdentity();
                glRotated(angulo,eje->getX(),eje->getY(),eje->getZ());
                double leMatriz[16];
                glGetDoublev(GL_MODELVIEW_MATRIX,leMatriz);
        glPopMatrix();

        postmultiplica(leMatriz);
}

void TAfin::escala(double factor_x, double factor_y, double factor_z){
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
                glLoadIdentity();
                glScaled(factor_x,factor_y,factor_z);;
                double leMatriz[16];
                glGetDoublev(GL_MODELVIEW_MATRIX,leMatriz);
        glPopMatrix();

        postmultiplica(leMatriz);
}

PV3D* TAfin::getPosicion(){
        double x,y,z;
        x=_m[12];
        y=_m[13];
        z=_m[14];

        return new PV3D(x,y,z,1);
}

//---------------------------------------------------------------------------

#pragma package(smart_init)
